# -*- coding: utf-8 -*-

"""
  @author: tangliqi
  @date: 2022/12/1 09:32
  @python version: 3.6 
  @contact me: 110
  ---------------------------------------
  @desc: python设计模式实现 => 模版模式.py
"""
from abc import abstractmethod


# 通过一个制作麦当劳套餐的例子来说明。
# 麦当劳通常三件套套餐都是选择一个主食，一个小吃，一杯饮料。
# 这个套餐的出餐方法就是一个模版方法，我们只需要在具体的套餐子类中定制自己的选择即可。
# 模版模式的构成：1.模版类（带有模版方法） 2.模版子类


# ============================  模版类  ============================
class McDonaldPackage:
    def get(self):
        print("--- 先准备主食 ---")
        self.staples()
        print("--- 再准备小吃 ---")
        self.snack()
        print("--- 最后准备饮料 ---")
        self.drink()
        print("--- 出餐咯 --- ")

    @abstractmethod
    def staples(self):
        """主食"""
        pass

    @abstractmethod
    def snack(self):
        """小吃"""
        pass

    @abstractmethod
    def drink(self):
        """饮料"""
        pass


# ============================  具体的套餐类  ============================
class Package1(McDonaldPackage):
    def staples(self):
        print("主食选择双层吉士汉堡")

    def snack(self):
        print("小吃选择薯条")

    def drink(self):
        print("饮料选择可乐")


class Package2(McDonaldPackage):
    def staples(self):
        print("主食选择巨无霸汉堡")

    def snack(self):
        print("小吃选择麦辣鸡翅")

    def drink(self):
        print("饮料选择雪碧")


if __name__ == '__main__':
    # 套餐1
    pkg1 = Package1()
    pkg1.get()

    print("\n")

    # 套餐2
    pkg2 = Package2()
    pkg2.get()
